#include<iostream>
#include<time.h>
using namespace std;

/*

	学生仅需针对填入FIFO和LRU,optim函数进行编程即可，具体会使用函数如下：
	函数及其参数说明：
		create_data：创建一个大小为N的数据
			data:用于存储数据的数组
			N:表示数据的大小
		FIFO：实现先进先出算法的函数，返回值为float类型
			data:使用的数据
			N:数据的大小
			memory_size:虚拟存储区大小
		LRU：实现最近最少使用算法的函数，返回值为float类型
			data:使用的数据
			N:数据的大小
			memory_size:虚拟存储区大小
		optim：实现最优化的函数，能够保证最大的调度
			data:使用的数据
			N:数据的大小
			memory_size:虚拟存储区大小
*/

void create_data(int data[], int N, int seed = 333) {
	srand(seed);
	for (int i = 0; i < N; i++) {
		data[i] = rand() % 5;
	}
}
void reset_data(int data[], int N) {
	for (int i = 0; i < N; i++) {
		data[i] = -1;
	}
}
void output_data(int data[], int N) {
	for (int i = 0; i < N; i++) {
		printf("%d ", data[i]);
	}
	printf("\n");
}

void show_output(int arr[], const int size) {
	for (int i = 0; i < size; ++i) {
		cout << arr[i] << " ";
	}
	cout << endl;
}

float FIFO(int arr[], const int& N, const int& memory_Size, int output[]) {
	//todo finish the func;
	return 0.0;
}

float LRU(int arr[], const int& N, const int& memory_Size, int output[]) {
	//todo finish the func;
	return 0.0;
}

float optim(int arr[], const int& N, const int& memory_Size, int output[]) {
	// todo :finish the function
	return 0.0;
}


int main() {
	const int data_num = 30;
	const int seed = 333;
	int max_memory_size = 5;
	int data[data_num];
	int output[data_num];
	create_data(data, data_num, seed);
	cout << "The data input is: " << endl;
	for (int i = 0; i < data_num; ++i)cout << data[i] << " ";
	cout << endl;
	for (int j = 2; j < max_memory_size; j++) {
		cout << "when cache size is " << j << endl;
		reset_data(output, data_num);
		cout << "The hit rate of FIFO is: " << FIFO(data, data_num, j, output) << endl;
		cout << "The output in FIFO is: " << endl;
		show_output(output, data_num);
		reset_data(output, data_num);
		cout << "The hit rate of LRU is: " << LRU(data, data_num, j, output) << endl;
		cout << "The output in LRU is: " << endl;
		show_output(output, data_num);
		reset_data(output, data_num);
		//cout << "The hit rate of Optim is: " << optim(data, data_num, j, output) << endl;
		cout << "\n";
	}
}